package com.bougaga.opensource.scheduler.core.scheduler;

import com.bougaga.opensource.scheduler.core.task.DelayedTask;

import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 延迟任务调度器接口
 * 
 * @author bougaga
 * @since 1.0.0
 */
public interface DelayedTaskScheduler {
    
    /**
     * 提交延迟任务
     * 
     * @param task 延迟任务
     * @return 任务ID
     */
    String submitTask(DelayedTask task);
    
    /**
     * 提交延迟任务（指定延迟时间）
     * 
     * @param taskName 任务名称
     * @param taskType 任务类型
     * @param taskData 任务数据
     * @param delayMillis 延迟时间（毫秒）
     * @return 任务ID
     */
    String submitTask(String taskName, String taskType, String taskData, Long delayMillis);
    
    /**
     * 提交延迟任务（指定执行时间）
     * 
     * @param taskName 任务名称
     * @param taskType 任务类型
     * @param taskData 任务数据
     * @param executeTime 执行时间
     * @return 任务ID
     */
    String submitTask(String taskName, String taskType, String taskData, LocalDateTime executeTime);
    
    /**
     * 取消任务
     * 
     * @param taskId 任务ID
     * @return 是否成功
     */
    boolean cancelTask(String taskId);
    
    /**
     * 获取任务信息
     * 
     * @param taskId 任务ID
     * @return 任务信息
     */
    DelayedTask getTask(String taskId);
    
    /**
     * 获取所有任务
     * 
     * @return 任务列表
     */
    List<DelayedTask> getAllTasks();
    
    /**
     * 获取待执行任务
     * 
     * @return 任务列表
     */
    List<DelayedTask> getPendingTasks();
    
    /**
     * 获取执行中任务
     * 
     * @return 任务列表
     */
    List<DelayedTask> getRunningTasks();
    
    /**
     * 获取已完成任务
     * 
     * @return 任务列表
     */
    List<DelayedTask> getCompletedTasks();
    
    /**
     * 根据任务类型获取任务
     * 
     * @param taskType 任务类型
     * @return 任务列表
     */
    List<DelayedTask> getTasksByType(String taskType);
    
    /**
     * 根据状态获取任务
     * 
     * @param status 任务状态
     * @return 任务列表
     */
    List<DelayedTask> getTasksByStatus(String status);
    
    /**
     * 启动调度器
     */
    void start();
    
    /**
     * 停止调度器
     */
    void stop();
    
    /**
     * 判断调度器是否运行中
     * 
     * @return 是否运行中
     */
    boolean isRunning();
    
    /**
     * 获取调度器统计信息
     * 
     * @return 统计信息
     */
    SchedulerStatistics getStatistics();
    
    /**
     * 清理已完成任务
     * 
     * @param beforeTime 清理此时间之前的任务
     * @return 清理的任务数量
     */
    int cleanupCompletedTasks(LocalDateTime beforeTime);
    
    /**
     * 异步提交任务
     * 
     * @param task 延迟任务
     * @return 异步结果
     */
    default CompletableFuture<String> submitTaskAsync(DelayedTask task) {
        return CompletableFuture.supplyAsync(() -> submitTask(task));
    }
    
    /**
     * 异步提交任务（指定延迟时间）
     * 
     * @param taskName 任务名称
     * @param taskType 任务类型
     * @param taskData 任务数据
     * @param delayMillis 延迟时间（毫秒）
     * @return 异步结果
     */
    default CompletableFuture<String> submitTaskAsync(String taskName, String taskType, String taskData, Long delayMillis) {
        return CompletableFuture.supplyAsync(() -> submitTask(taskName, taskType, taskData, delayMillis));
    }
}
